<?php
/**
 * 
 * http://my.oschina.net/mingtingling/blog/97104
 * @author LIZHEN<wwwlzhcom@163.com>
 * @version $Id: ModelBase.php 2013-12-10 下午05:28:54 $
 * @package
 */
abstract class ModelBase extends Base {
	protected $_db = null;
    protected $_sqlParser = null;
    protected $_options = array(
		'where' => '',
		'field' => '',
		'distinct' => '',
		'table' => '',
		'order' => '',
		'group' => '',
        'limit' => ''
	);

	public function __construct() {
        if(null !== $this->_db) {
            ConnectionManager::closeConnection();
            $this->_db = null;
        }
		$this->_db = ConnectionManager::getConnection();
		$this->_sqlParser = new SqlParser();
	}
	public function execute($sql,Array $arr) {
		$this->_db->prepare($sql);
		$this->_db->execute($arr);
	}
	public function getAll() {
		return $this->_db->getAllByAssocArray();
	}
	/**
	 * 首先，我们实现函数的链式操作，即如：$this->where()->table()->select()
	 * 我们知道，如果要实现这种函数链，需要return $this,所以我们要保证在调用select
	 * 方法之前的所有函数都要返回$this，也就是这个对象，最简单的方法就是在每个方
	 * 法的最后执行return $this,但是这样实在是一个麻烦的事情，我们都知道PHP有一系
	 * 列的魔术方法可以实现非常强大的功能，今天我们就要用到其中的一个魔术方法：
	 * <b>__call</b>，
	 * 这儿方法是调用了对象中一个不存在的方法时调用的，
	 * 也就是系统在抛出错误之前进行最后一次挽救，如果有__call，
	 * 那么就将决定权交给__call，否则直接抛出错误。 
	 * @see Base::__call()
	 */
	public function __call($method,$args) {
        Logger::debug(" __call method : %s , args : %s", $method, json_encode($args));
		if(in_array($method,array(
			'where','field','distinct','table','order','group','limit'
		))) {
			$this->_options[$method] = isset($args[0]) ? $args[0] : null;
			return $this;
		} else {
			parent::__call($method,$args);
		}
	}

    //$this->where(array( 'tid' => array('gt',2 ))->table('test')->select();
	public abstract function select() ;

    //$this->table('test')->where(array('tid' > array('gt',1)))->update(array('test' => 'aaaaa'));
    //数组可使用array('name'=>'+=1', 'base'=>'-=1');程序会自动解析为`name` = `name` + 1, `base` = `base` - 1
    public abstract function update($arr);

    //$this->table('test')->insert(array('tid' => 2,'test' => 'bbb'));
    public abstract function insert($arr);

    //$this->table('test')->where(array('tid' => array('gt',2)))->delete();
    public abstract function delete();

}



